/**
 * 封装XHR请求（优化版）
 * @param {Object} options 请求配置
 * @param {string} options.url 请求地址
 * @param {'GET'|'POST'} [options.method='GET'] 请求方法
 * @param {Object|FormData} [options.data] 请求数据
 * @param {Object} [options.headers={}] 请求头
 * @param {number} [options.timeout=5000] 超时时间（ms）
 * @param {Function} [options.beforeRequest] 请求前拦截器
 * @returns {Promise<Object>} 
 */
export default function request(options) {
    return new Promise((resolve, reject) => {
        // 1. 参数合并与默认值
        const {
            url,
            method = 'GET',
            data = null,
            headers = {},
            timeout = 5000,
            beforeRequest = null
        } = options;

        const xhr = new XMLHttpRequest();

        // 2. 请求拦截器（动态修改配置）
        if (typeof beforeRequest === 'function') {
            Object.assign(options, beforeRequest(options) || {});
        }

        // 3. 初始化请求
        xhr.open(method, url, true);

        // 4. 设置请求头（排除FormData的默认Content-Type）
        if (!(data instanceof FormData)) {
            headers['Content-Type'] = headers['Content-Type'] || 'application/json';
        }
        Object.keys(headers).forEach(key => {
            xhr.setRequestHeader(key, headers[key]);
        });

        // 5. 超时与错误处理
        xhr.timeout = timeout;
        xhr.ontimeout = () => reject(new Error(`Request timeout (${timeout}ms)`));
        xhr.onerror = () => reject(new Error('Network error'));

        // 6. 响应处理
        xhr.onreadystatechange = () => {
            if (xhr.readyState !== XMLHttpRequest.DONE) return;

            if (xhr.status >= 200 && xhr.status < 300) {
                try {
                    const response = xhr.responseText ? JSON.parse(xhr.responseText) : null;
                    resolve(response);
                } catch (e) {
                    reject(new Error('Invalid JSON response'));
                }
            } else {
                reject(new Error(`HTTP Error: ${xhr.status} ${xhr.statusText}`));
            }
        };

        // 7. 发送请求（智能处理FormData和普通JSON）
        const sendData = method === 'POST' || method === 'PATCH' || method === 'PUT' && data ?
            (data instanceof FormData ? data : JSON.stringify(data)) :
            null;
        xhr.send(sendData);
    });
}